792. Number of Matching Subsequences
题目
Given string S
and a dictionary of words words
, find the number of words[i]
that is a subsequence of S
.
1 | Example : |
Note:
- All words in
words
andS
will only consists of lowercase letters. - The length of
S
will be in the range of[1, 50000]
. - The length of
words
will be in the range of[1, 5000]
. - The length of
words[i]
will be in the range of[1, 50]
.
解题报告
题意很简单,给定一个源字符串 S
和一组字符串 words
,问 words
内有多少是 S
的子序列。
如果用暴力解的话这题很简单,但是时间代价是 $O(NM)$,$N$ 为 S
的长度,$M$ 为 words
的长度。所以需要找更高效的算法。
1 | // Bruth-Force |
从暴力解法里可以看到,每次都会在一些不匹配的字符串上浪费时间。那可不可以每个字符只匹配那些可以匹配的字符串呢?
新的算法将每个 word
放在不同的队列里,这些队列以开头字母区分,那么假设现在 S
遍历到 c
,我只需要将 queue[c]
中的每个 word
匹配并放进新的队列即可。这便可以省去寻找可以匹配的 word
的时间。
新的时间代价有点难表示,最坏的情况下为 $O(MN)$ ,即所有 word
都与 S
相同,最好时为 $O(N)$,即没有一个 word
可以匹配 S
。可以通用地表示为 $O(\max{\sum len(subseq),N})$。其中 $subseq$ 为完全匹配或部分匹配的子序列。
Solution
1 | class Solution { |
评论